home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsWrite.rexx < prev    next >
OS/2 REXX Batch file  |  1995-01-26  |  28KB  |  1,173 lines

  1. /* $VER: bbsWrite.rexx 8.4 (26.1.95)
  2. copyright ⌐ 1994-95 Richard Lee Stockton
  3. BBBBS write & setup email or message
  4. FREELY DISTRIBUTABLE
  5. */
  6.  
  7. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  8. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  9.  
  10. OPTIONS RESULTS
  11.  
  12. SIGNAL ON BREAK_C
  13. SIGNAL ON BREAK_E
  14. SIGNAL ON FAILURE
  15. SIGNAL ON SYNTAX
  16.  
  17. PARSE ARG name maxtime edtype toname orig msgnum msgdir subj 
  18.  
  19. CALL TIME('R')
  20. IF toname='.' THEN toname=''
  21. IF orig='.' THEN orig=''
  22. subj=STRIP(subj)
  23. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  24. lineup='1B'x'M'
  25. CR=''
  26. IF ADDRESS()='BAUD' THEN
  27.   DO
  28.     CR='0D'x
  29.     frombb=1
  30.   END
  31. ELSE frombb=0
  32. courtesy=''
  33. thechosen.=''
  34. CALL config()
  35. IF ~loaddata() THEN
  36.   DO
  37.     SAY 'Userfile' name 'failed to open for reading!'CR
  38.     EXIT 0
  39.   END
  40. SAY '                    'CR
  41. def=''
  42. pen3=''
  43. bak2=''
  44. IF colorflag=0 THEN
  45.   DO
  46.     def=''
  47.     pen3=''
  48.     bak2=''
  49.   END
  50. Friends.=''
  51. IF OPEN(f,bbspath'Friends/'name,'R')~=0 THEN
  52.   DO
  53.     DO i=1
  54.       Friends.i=READLN(f)
  55.       IF EOF(f) THEN LEAVE i
  56.     END
  57.     Friends.0=i
  58.     CALL CLOSE(f)
  59.   END
  60. IF edtype='MAIL' THEN lastwrit=countcheck(bbspath'Numbers/LastMail 0')
  61. ELSE 
  62.   DO
  63.     IF OPEN(f,bbspath'Lists/Conferences','R')~=0 THEN
  64.       DO
  65.         msg.=''
  66.         DO i=1
  67.           line=READLN(f)
  68.           IF line='END' | EOF(f) THEN LEAVE i
  69.           num=WORD(line,1)
  70.           IF DATATYPE(num,'W') THEN msg.num=WORD(line,2)
  71.           IF num=msgdir THEN LEAVE i
  72.         END
  73.         CALL CLOSE(f)
  74.       END
  75.     IF edtype='MSG' THEN
  76.       DO
  77.         IF msgdir=0 THEN
  78.           IF areaselect() THEN EXIT 0
  79.       END
  80.     lastwrit=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  81.     IF edinfo(msgpath||msgdir'.txt',msg.msgdir,'Public Message Conference') THEN
  82.       EXIT 0
  83.   END
  84. IF toname='' THEN
  85.   DO
  86.     IF edtype='MAIL' THEN
  87.       DO
  88.         CALL selectchosen(1 pen3'Send PRIVATE' edtype lastwrit+1 'To: 'def)
  89.         toname=thechosen.1
  90.       END
  91.     ELSE toname=getinput(1 0 pen3'Post A PUBLIC Message To: 'def)
  92.   END
  93. toname=SPACE(toname,1,'_')
  94. toname=cleanstring(1':'toname)
  95. toname=check_alias(toname)
  96. IF toname='' | FIND(exclusion,toname)>0 THEN
  97.   DO
  98.     IF toname='' & edtype='MSG' THEN toname='ALL'
  99.     ELSE toname=sysop
  100.     SAY pen3'*** Re-Addressed to'def toname||CR
  101.   END
  102. IF toname~='ALL' THEN
  103.   DO
  104.     IF toname='BBBBS' THEN toname=sysop
  105.     IF ~EXISTS(bbspath'Users/'toname) THEN
  106.       DO
  107.         IF courtesy='' THEN CALL loadcourtesy()
  108.         IF FIND(courtesy,toname)=0 THEN
  109.           DO
  110.             SAY CR
  111.             SAY bak2' 'toname' is not on the user list! 'def||CR
  112.             IF edtype='MAIL' THEN EXIT 0
  113.             ELSE IF getinput(1 1 'Do you want to use it anyway? (nY) > ')='N' THEN EXIT 0
  114.           END
  115.       END
  116.   END
  117. IF frombb THEN
  118.   DO
  119.     IF toname=sysop THEN CALL sound('FEEDBACK')
  120.     ELSE CALL sound('MESSAGE')
  121.   END
  122. IF edtype='MAIL' THEN
  123.   DO
  124.     CALL MAKEDIR(bbspath'EMail/'toname)
  125.     mailname=bbspath'EMail/'toname'/'name'.'lastwrit+1
  126.   END
  127. ELSE
  128.   DO
  129.     CALL MAKEDIR(msgpath||msgdir)
  130.     mailname=msgpath||msgdir'/'lastwrit+1
  131.   END
  132. lynes.=''
  133. lynes.0=6
  134. IF edtype='MAIL' THEN lynes.1=' Mail:' lastwrit+1  /* FILE: filename */
  135. ELSE lynes.1='  Msg:' lastwrit+1          /* Msg: MSG# REPLY # # ... */
  136. lynes.2=' From:' name
  137. IF city~='' THEN lynes.2=lynes.2' - 'city
  138. lynes.3='   To:' toname                       /*  To: toname   MSG # */
  139. IF edtype='MAIL' THEN
  140.   DO
  141.     IF OPEN(f,bbspath||'Users/'toname,'R')~=0 THEN
  142.       DO
  143.         CALL READLN(f)
  144.         CALL READLN(f)
  145.         temp=READLN(f)
  146.         CALL CLOSE(f)
  147.         temp=docity(temp)
  148.         IF temp~='' THEN lynes.3=lynes.3' - 'temp
  149.       END
  150.     IF subj='|@NEW@|' THEN
  151.       DO
  152.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  153.         subj='Welcome to' bbsname
  154.       END
  155.   END
  156. IF edtype='REPLY' THEN
  157.   DO
  158.     SAY pen3'Subj:'def subj||CR
  159.     temp=getinput(0 0 'Change the current subject? (Ny) > ')
  160.     IF LENGTH(temp)>3 THEN subj=temp
  161.     ELSE IF LEFT(UPPER(temp),1)='Y' THEN subj=''
  162.   END
  163. IF subj='' THEN
  164.   DO
  165.     SAY pen3'Enter the'def 'Subject' pen3'of this message (1 line).'def||CR
  166.     subj=getinput(0 0 pen3': 'def)
  167.     IF level>sysoplevel THEN
  168.       DO
  169.         temp=bbspath'BBS_TEXT/SUBJ.'WORD(subj,1)
  170.         IF EXISTS(temp) THEN
  171.           IF getinput(1 1 'Use SUBJ.'WORD(subj,1)'? (nY) > ')~='N' THEN
  172.             CALL readlines(temp 7)
  173.       END
  174.   END
  175. IF LENGTH(subj)>66 THEN subj=LEFT(subj,66)
  176. IF subj='' THEN subj='?'
  177. lynes.4=' Subj:' subj
  178. lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  179. IF edtype~='MAIL' THEN lynes.5=LEFT(lynes.5,39) 'Conference:' msg.msgdir
  180. lynes.6=LEFT('',74,'=')
  181. IF edtype='REPLY' THEN lynes.3=lynes.3'  MSG 'msgnum
  182. DO i=1 TO lynes.0
  183.   SAY lynes.i||CR
  184. END
  185. IF frombb THEN temp='File'
  186. ELSE temp='LOCAL'
  187. CALL writebuffer(scratch'/Message'temp)
  188. CALL DELETE(mailname)
  189. IF savelines(mailname) THEN EXIT 0
  190. CALL seelines(1)
  191. IF thechosen.0='' THEN
  192.   DO
  193.     thechosen.0=1
  194.     thechosen.1=toname
  195.   END
  196. carbons=thechosen.0+1
  197. DO FOREVER
  198.   IF thechosen.0>=carbons THEN
  199.     DO
  200.       junk='Copies To:'
  201.       DO cci=carbons TO thechosen.0
  202.         junk=junk thechosen.cci
  203.       END
  204.       SAY junk||CR
  205.     END
  206.   pline=''
  207.   IF edtype='MAIL' THEN pline='['pen3'C'def']opies'
  208.   pline=STRIP(pline '['pen3'E'def']dit ['pen3'K'def']ill ['pen3'R'def']ead')
  209.   pline=pline '['pen3'U'def']pload-Text ['pen3'S'def']end' edtype'? (ekrSu) 'def
  210.   junk=getinput(1 1 pline)
  211.   IF junk='E' THEN
  212.     DO
  213.       IF level>sysoplevel THEN firstedit=1
  214.       ELSE firstedit=7
  215.       IF bbsEd.rexx(firstedit mailname name TRUNC(maxtime-TIME('E'))-28)=2 THEN EXIT 0
  216.       junk='R'
  217.     END
  218.   ELSE IF edtype='MAIL' & junk='C' THEN
  219.     DO
  220.       CALL selectchosen(carbons pen3'Carbon Copies To: 'def)
  221.       junk='R'
  222.     END
  223.   ELSE IF junk='K' THEN
  224.     DO
  225.       IF DELETE(mailname)=1 THEN SAY edtype 'DELETED.'CR
  226.       EXIT 0
  227.     END
  228.   ELSE IF junk='U' THEN
  229.     DO
  230.       CALL txup(mailname)
  231.       junk='R'
  232.     END
  233.   IF junk='R' THEN
  234.     DO
  235.       CALL readlines(mailname 1)
  236.       CALL seelines(1)
  237.       nonstop=0
  238.     END
  239.   ELSE BREAK
  240. END
  241. IF edtype='MAIL' THEN
  242.   DO
  243.     IF orig~='' & toname~='' THEN
  244.       DO
  245.         IF toname=sysop THEN junk='Y'
  246.         ELSE junk=getinput(1 1 'Attach original mail from' toname'? (nY) > ')
  247.         IF junk~='N' THEN
  248.           IF ~readlines(orig 1) THEN CALL savelines(mailname)
  249.       END
  250.     junk=getinput(1 1 pen3'Attach a file to this message? (Ny) > 'def)
  251.     IF junk='Y' THEN
  252.       DO
  253.         savearg=arg
  254.         arg=''
  255.         IF frombb THEN arg=getinput(0 0 'Filename: ')
  256.         curdir=PRAGMA('D')
  257.         CALL MAKEDIR(bbspath'EmailFiles/'toname)
  258.         CALL setdir(bbspath'EmailFiles/'toname)
  259.         DO WHILE uload()=2
  260.         END
  261.         IF WORD(STATEF(bbspath'EmailFiles/'toname'/'arg),2)>1 THEN
  262.           DO
  263.             CALL readlines(mailname 1)
  264.             IF arg~='' THEN lynes.1=lynes.1'  FILE: 'arg
  265.             CALL setdir(curdir)
  266.             CALL DELETE(mailname)
  267.             CALL savelines(mailname)
  268.           END
  269.         ELSE
  270.           DO
  271.             CALL DELETE(bbspath'EmailFiles/'toname'/'arg)
  272.             SAY pen3'*** Upload failed! ***'def||CR
  273.           END
  274.         arg=savearg
  275.       END
  276.     totmail=WORD(data.17,2)
  277.     IF ~DATATYPE(totmail,'W') THEN totmail=1
  278.     ELSE totmail=totmail+1
  279.     data.17=WORD(data.17,1)'  'totmail'  'WORD(data.17,3)
  280.   END
  281. CALL readlines(mailname 1)
  282. DO ui=1 TO thechosen.0
  283.   IF thechosen.ui='' THEN ITERATE ui
  284.   IF ui>1 THEN
  285.     DO
  286.       CALL MAKEDIR(bbspath'Email/'thechosen.ui)
  287.       newname=bbspath'Email/'thechosen.ui'/'name'.'lastwrit+1
  288.       IF ui<carbons THEN lynes.3='   To:' thechosen.ui
  289.       ELSE
  290.         DO
  291.           lynes.1=lynes.1'  (Carbon Copy)'
  292.           lynes.3='   To:' thechosen.1
  293.         END
  294.       CALL savelines(newname)
  295.       IF WORDS(lynes.1)>3 & EXISTS(bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4)) THEN
  296.         DO
  297.           CALL MAKEDIR(bbspath'EmailFiles/'thechosen.ui)
  298.           ADDRESS COMMAND 'C:COPY' bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4) bbspath'EmailFiles/'thechosen.ui
  299.           line2='Copied' WORD(lynes.1,4)
  300.           SAY line2 'to the' thechosen.ui 'file area.'CR
  301.           CALL send2log(line2)
  302.         END
  303.     END
  304.   line=edtype':'lastwrit+1 'at' TIME('C') 'to' thechosen.ui
  305.   IF edtype~='MAIL' THEN
  306.     DO
  307.       IF EXISTS(bbspath'Users/'thechosen.ui) THEN
  308.         CALL msgmark(thechosen.ui msgdir lastwrit+1)
  309.       line=line 'in' msg.msgdir
  310.     END
  311.   CALL send2log(line)
  312.   line=edtype 'Sent To' thechosen.ui
  313.   l2='in the' msg.msgdir 'conference.'
  314.   IF edtype~='MAIL' THEN line=line l2
  315.   IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=thechosen.ui THEN
  316.     DO
  317.       oldmess=GETCLIP('BBS_MESSAGE')
  318.       IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  319.       IF edtype='MAIL' THEN l3='You have new Email.'
  320.       ELSE l3='There is a new message addressed to you' l2
  321.       CALL SETCLIP('BBS_MESSAGE',oldmess||l3)
  322.     END
  323.   SAY line||CR
  324. END
  325. IF edtype='MAIL' THEN CALL countcheck(bbspath'Numbers/LastMail' lastwrit+1)
  326. ELSE CALL countcheck(bbspath'Numbers/LastMessage'msgdir lastwrit+1)
  327. CALL setdir(libpath||dirs.1)
  328. CALL savedata()
  329. EXIT 1
  330.  
  331.  
  332. msgmark:
  333. PARSE ARG markname markdir markmsg .
  334. IF OPEN(f,bbspath'Users/'markname,'R')=0 THEN RETURN
  335. mlines.=''
  336. DO mi=1
  337.   temp=READLN(f)
  338.   IF EOF(f) THEN LEAVE mi
  339.   mlines.mi=STRIP(temp)
  340. END
  341. CALL CLOSE(f)
  342. mlines.0=mi-1
  343. CALL DELAY(28)
  344. mlines.24=STRIP(mlines.24 markdir'/'markmsg)
  345. IF OPEN(f,bbspath'Users/'markname,'W')=0 THEN RETURN
  346. DO mi=1 TO mlines.0
  347.   CALL WRITELN(f,mlines.mi)
  348. END
  349. CALL CLOSE(f)
  350. RETURN
  351.  
  352.  
  353. edinfo:
  354. PARSE ARG t1,t2,t3
  355. IF level<sysoplevel THEN RETURN 0
  356. IF getinput(1 1 'Edit the'pen3 t2 def||t3 'info file? (Ny) > ')='Y' THEN
  357.   DO
  358.     IF ~EXISTS(t) THEN
  359.       DO
  360.         IF OPEN(f,t1,'W')~=0 THEN
  361.           DO
  362.             CALL WRITELN(f,TRIM(CENTER('***'pen3 t2 def||t3 '***',75)))
  363.             CALL WRITELN(f,LEFT('',75,'='))
  364.             CALL CLOSE(f)
  365.             CALL DELAY(28)
  366.           END
  367.       END
  368.     CALL bbsEd.rexx(1 t1 name TRUNC(maxtime-TIME('E'))-28)
  369.     RETURN 1
  370.   END
  371. RETURN 0
  372.  
  373.  
  374. areaselect:
  375. SAY pen3||LEFT('-',75,'-')||def||CR
  376. count=0
  377. smsg.=''
  378. DO i=1 TO level
  379.   IF msg.i='' THEN ITERATE i
  380.   count=count+1
  381.   smsg.count=msg.i i
  382. END
  383. smsg.0=count
  384. IF count>0 THEN CALL QSort(1,count,smsg)
  385. count=0
  386. msgs.=''
  387. DO i=1 TO smsg.0
  388.   tempnum=WORD(smsg.i,2)
  389.   tempdir=WORD(smsg.i,1)
  390.   IF FIND(data.21,tempnum)=0 THEN
  391.     DO
  392.       string=' '
  393.       IF tempnum<10 THEN string=string' '
  394.       string=string || tempnum'.'
  395.       IF WORD(data.22,tempnum)='' | WORD(data.22,tempnum)>=0 THEN
  396.         string=string LEFT(tempdir,20)
  397.       ELSE string=string pen3'-OFF-'def LEFT(tempdir,14)
  398.       count=count+1
  399.       msgs.count=string
  400.     END
  401. END
  402. DROP smsg.
  403. msgs.0=count%3
  404. IF (count//3)>0 THEN msgs.0=msgs.0+1
  405. DO i=1 TO msgs.0
  406.   DO j=1 TO 2
  407.     k=i+j*msgs.0
  408.     IF k<=count THEN msgs.i=msgs.i msgs.k
  409.   END
  410. END
  411. DO i=1 TO msgs.0
  412.   SAY msgs.i||CR
  413.   IF i//linesperpage=0 & i<msgs.0 THEN CALL waiting()
  414. END
  415. temp=getinput(1 0 pen3'Select Message Conference: 'def)
  416. IF ~DATATYPE(temp,'W') | temp<1 | temp>level | FIND(data.21,temp)>0 THEN RETURN 1
  417. IF msg.temp='' THEN RETURN 1
  418. msgdir=temp
  419. RETURN 0
  420.  
  421.  
  422. selectchosen:
  423. PARSE ARG startat selectline
  424. IF startat<2 THEN thechosen.=''
  425. line='Enter list of comma separated user names'
  426. IF level>sysoplevel THEN line=line 'or ALL'
  427. SAY line||CR
  428. thechosen.startat=getinput(1 0 selectline' ')
  429. IF STRIP(thechosen.startat)='' THEN RETURN 1
  430. thechosen.startat=SPACE(thechosen.startat,1,'_')
  431. thechosen.0=startat
  432. IF level>sysoplevel & thechosen.startat='ALL' THEN
  433.   thechosen.startat=SHOWDIR(bbspath'Users','F',',')
  434. IF POS(',',thechosen.startat)>0 THEN
  435.   DO
  436.     temp=TRANSLATE(thechosen.startat,' ',',')
  437.     thechosen.0=thechosen.0+WORDS(temp)-1
  438.     DO ei=1 TO WORDS(temp)
  439.       eii=startat+ei-1
  440.       thechosen.eii=STRIP(WORD(temp,ei))
  441.     END
  442.   END
  443. DO ei=startat TO thechosen.0
  444.   thechosen.ei=check_alias(thechosen.ei)
  445.   DO WHILE ~EXISTS(bbspath'Users/'thechosen.ei)
  446.     IF thechosen.ei~='' THEN
  447.       DO
  448.         IF FIND(exclusion,thechosen.ei)>0 | thechosen.ei='BBBBS' THEN
  449.           DO
  450.             thechosen.ei=sysop
  451.             ITERATE ei
  452.           END
  453.         IF courtesy='' THEN CALL loadcourtesy()
  454.         IF FIND(courtesy,thechosen.ei)>0 THEN ITERATE ei
  455.       END
  456.     SAY thechosen.ei 'not found! Enter that name again or press RETURN.'CR
  457.     thechosen.ei=getinput(1 0 pen3||selectline' 'def)
  458.     IF thechosen.ei='' THEN
  459.       DO
  460.         IF getinput(1 1 'Do you want to see the list of current users? (Ny) > ')='Y' THEN
  461.           IF readlines(bbspath'Lists/USERS' 1)=0 THEN CALL seelines(1)
  462.         ITERATE ei
  463.       END
  464.     thechosen.ei=SPACE(thechosen.ei,1,'_')
  465.   END
  466. END
  467. RETURN 0
  468.  
  469.  
  470. loadcourtesy:
  471. IF EXISTS(bbspath'Lists/Courtesy') THEN
  472.   DO
  473.     IF OPEN(f,bbspath'Lists/Courtesy','R') THEN
  474.       DO
  475.         SAY 'Checking Courtesy List...'CR
  476.         DO i=1
  477.           line=READLN(f)
  478.           IF EOF(f) THEN BREAK
  479.           line=cleanstring(1':'line)
  480.           courtesy=courtesy line
  481.         END
  482.         CALL CLOSE(f)
  483.       END
  484.   END
  485. RETURN
  486.  
  487.  
  488. waiting:
  489. CALL checktime()
  490. IF waitchar='Q' THEN
  491.   DO
  492.     waitchar=''
  493.     RETURN
  494.   END
  495. waitchar=''
  496. IF nonstop=1 THEN RETURN
  497. OPTIONS PROMPT pen3'                          RETURN=Continue 'def
  498. PULL waitchar
  499. CALL cleanline(1)
  500. CALL checkdcd()
  501. RETURN
  502.  
  503.  
  504. waiting2:
  505. CALL checktime()
  506. IF nonstop=1 THEN RETURN 0
  507. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  508. IF waitchar='N' THEN
  509.   DO
  510.     nonstop=1
  511.     SAY lineup||pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def||CR
  512.     SAY CR
  513.     CALL DELAY(99)
  514.     waitchar=''
  515.   END
  516. CALL cleanline(1)
  517. CALL checkdcd()
  518. IF waitchar='Q' THEN RETURN 1
  519. RETURN 0
  520.  
  521.  
  522. seelines:
  523. DO i=1 TO lynes.0
  524.   IF LEFT(lynes.i,2)=': ' & WORDS(lynes.i)=2 THEN ITERATE i
  525.   ELSE IF LEFT(lynes.i,10)='Directory ' | LEFT(lynes.i,5)='=====' THEN
  526.     SAY pen3||lynes.i||def||CR
  527.   ELSE SAY lynes.i||CR
  528.   IF i//linesperpage=0 & i<lynes.0 THEN
  529.     IF waiting2() THEN LEAVE i
  530. END
  531. nonstop=0
  532. RETURN
  533.  
  534.  
  535. readlines:
  536. CALL CLOSE(f)
  537. PARSE ARG tempname readstart .
  538. IF OPEN(f,tempname,'R')=0 THEN RETURN 1
  539. IF readstart<2 THEN lynes.=''
  540. DO ri=readstart
  541.   line=READLN(f)
  542.   IF EOF(f) THEN BREAK
  543.   lynes.ri=line
  544. END
  545. lynes.0=ri-1
  546. CALL CLOSE(f)
  547. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),2)='/E' | LEFT(UPPER(lynes.ri),2)='/S'
  548. END
  549. lynes.0=ri
  550. RETURN 0
  551.  
  552.  
  553. savelines:
  554. PARSE ARG tempname .
  555. IF EXISTS(tempname) & edtype='MAIL' THEN
  556.   DO
  557.     ok=OPEN(f,tempname,'A')
  558.     IF ok~=0 THEN CALL WRITELN(f,LEFT('',74,'^'))
  559.   END
  560. ELSE ok=OPEN(f,tempname,'W')
  561. IF ok=0 THEN
  562.   DO
  563.     line='***' tempname 'failed to open for saving!'
  564.     CALL send2log(line)
  565.     SAY line||CR
  566.     RETURN 1
  567.   END
  568. DO wi=1 TO lynes.0
  569.   CALL WRITELN(f,lynes.wi)
  570. END
  571. CALL CLOSE(f)
  572. RETURN 0
  573.  
  574.  
  575. setdir:
  576. PARSE ARG tempdir
  577. CALL PRAGMA('D',STRIP(tempdir))
  578. directory=PRAGMA('D')
  579. IF frombb THEN Data directory
  580. slash=LASTPOS('/',directory)
  581. IF slash=0 THEN slash=LASTPOS(':',directory)
  582. plaindir=directory
  583. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  584. RETURN
  585.  
  586.  
  587. config:
  588. arg='s:CONFIG.BBS'
  589. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  590. IF readlines(arg 1) THEN
  591.   DO
  592.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'CR
  593.     EXIT 0
  594.   END
  595. compos=POS('/*',lynes.1)
  596. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  597. bbsname=STRIP(lynes.1)
  598. sysop=WORD(lynes.2,1)
  599. exclusion=STRIP(lynes.3)
  600. bbsdevice=WORD(lynes.4,1)
  601. sysoplevel=WORD(lynes.5,1)
  602. bbspath=WORD(lynes.6,1)
  603. IF ~EXISTS(bbspath) THEN
  604.   DO
  605.     SAY bbspath 'does not exist!'CR
  606.     EXIT 0
  607.   END
  608. testchar=RIGHT(bbspath,1)
  609. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  610. msgpath=WORD(lynes.7,1)
  611. IF ~EXISTS(msgpath) THEN
  612.   DO
  613.     SAY msgpath 'does not exist!'CR
  614.     SIGNAL DONE2
  615.   END
  616. testchar=RIGHT(msgpath,1)
  617. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  618. msgpath=msgpath'MSG'
  619. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  620. bbsprefs.=''
  621. DO i=16 TO 41
  622.   j=i-15
  623.   bbsprefs.j=STRIP(WORD(lynes.i,1))
  624. END
  625. spellpath=WORD(lynes.9,1)
  626. IF bbsprefs.5 & ~EXISTS(spellpath) THEN
  627.   DO
  628.     SAY spellpath 'does not exist!'CR
  629.     bbsprefs.5=0
  630.   END
  631. IF bbsprefs.10 THEN scratch=bbspath'Scratch'
  632. ELSE scratch='RAM:Scratch'
  633. CALL MAKEDIR(scratch)
  634. RETURN
  635.  
  636.  
  637. writebuffer:
  638. PARSE ARG bufname .
  639. IF frombb THEN Capture OFF
  640. CALL DELETE(bufname)
  641. startnum=lynes.0+1
  642. SAY 'Type 'pen3'/E'def' or 'pen3'/S'def' on a new line to Exit and Save.'CR
  643. IF EXISTS(bufname) THEN
  644.   DO
  645.     CALL DELAY(56)
  646.     CALL DELETE(bufname)
  647.     CALL DELAY(56)
  648.   END
  649. IF frombb THEN
  650.   DO
  651.     CaptWrap 74
  652.     Send pen3
  653.     Capture bufname
  654.     Send def
  655.     TimeOut 120
  656.     DO bufloop=1
  657.       Wait '/E,/S,RING,NO CARRIER'
  658.       Status 'L'
  659.       test=LEFT(UPPER(cleanstring(0':'RESULT)),2)
  660.       CALL checkdcd()
  661.       IF test='/E' | test='/S' | test='/X' THEN LEAVE bufloop
  662.     END
  663.     IF test~='/X' THEN Send '\b\b'pen3
  664.     Capture OFF
  665.     CALL checkdcd()
  666.     TimeOut maxidle
  667.     SAY def||CR
  668.     CALL readlines(bufname startnum)
  669.     CALL wrapbuf(startnum)
  670.     QUEUE CR
  671.   END
  672. ELSE
  673.   DO
  674.     DO bufloop=startnum
  675.       PARSE PULL line
  676.       IF LEFT(UPPER(STRIP(line)),2)='/E' | LEFT(UPPER(STRIP(line)),2)='/S' THEN
  677.         LEAVE bufloop
  678.       lynes.bufloop=line
  679.     END
  680.     lynes.0=bufloop-1
  681.     CALL wrapbuf(startnum)
  682.     CALL DELETE(bufname)
  683.     CALL savelines(bufname)
  684.     SAY
  685.   END
  686. RETURN
  687.  
  688.  
  689. wrapbuf:
  690. ARG startnum .
  691. CALL cleanline(1)
  692. SAY pen3'Wordwrapping...'def||CR
  693. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  694. lynes.startnum=cleanstring(2':'lynes.startnum)
  695. DO wi=startnum WHILE wi<=lynes.0
  696.   wj=wi+1
  697.   lynes.wj=TRANSLATE(lynes.wj,' ','09'x)
  698.   lynes.wj=cleanstring(2':'lynes.wj)
  699.   IF LENGTH(lynes.wi)>75 THEN
  700.     DO
  701.       testchar=''
  702.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  703.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  704.         DO
  705.           DO wjj=lynes.0 TO wi+1 BY -1
  706.             wk=wjj+1
  707.             lynes.wk=lynes.wjj
  708.           END
  709.           lynes.wj=''
  710.           lynes.0=lynes.0+1
  711.         END
  712.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  713.         IF WORDS(lynes.wi)=1 THEN
  714.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  715.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  716.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  717.       END
  718.     END
  719. END
  720. RETURN
  721.  
  722.  
  723. txup:
  724. PARSE ARG uparg .
  725. IF frombb THEN
  726.   DO
  727.     SAY 'Ready to append' pen3'TEXT ONLY'def 'using'pen3 protocol||def||CR
  728.     pline='Are you SURE your file is un-compressed text? (Ny) > '
  729.     IF getinput(1 1 pline)~='Y' THEN RETURN
  730.   END
  731. savearg=arg
  732. arg='Upload'
  733. arg2='tempfile1'
  734. IF frombb THEN arg=arg'File'
  735. ELSE
  736.   DO
  737.     arg=arg'LOCAL'
  738.     arg2=arg2'LOCAL'
  739.   END
  740. curdir=PRAGMA('D')
  741. CALL setdir(scratch)
  742. CALL DELETE(arg)
  743. CALL DELETE(arg2)
  744. IF uload()=0 THEN
  745.   DO
  746.     ADDRESS COMMAND 'C:copy' uparg scratch'/'arg2 'CLONE'
  747.     CALL DELETE(uparg)
  748.     ADDRESS COMMAND 'C:join' scratch'/'arg2 PRAGMA('D')'/'arg 'AS' uparg
  749.   END
  750. CALL readlines(uparg 1)
  751. CALL setdir(curdir)
  752. arg=savearg
  753. RETURN
  754.  
  755.  
  756. chpro:
  757. arg=UPPER(LEFT(arg,1))
  758. IF(arg='') THEN
  759.   DO
  760.     SAY CR
  761.     SAY '['pen3'W'def']- WXModem'CR
  762.     SAY '['pen3'X'def']- XModem-CRC'CR
  763.     SAY '['pen3'K'def']- XModem-1K'CR
  764.     SAY '['pen3'Y'def']- YModem'CR
  765.     SAY '['pen3'G'def']- YModem-G'CR
  766.     SAY '['pen3'Z'def']- ZModem'CR
  767.     SAY CR
  768.     arg=getinput(1 0 STRIP(protocol) '> ')
  769.  END
  770. IF LEFT(UPPER(arg),1)='A' THEN arg='Z'
  771. Set arg
  772. Status Transfer
  773. protocol=STRIP(RESULT)
  774. SAY protocol||CR
  775. RETURN
  776.  
  777.  
  778. uload:
  779. CALL bbsspace(12)
  780. SAY CR
  781. IF bbsk<1 THEN
  782.   DO
  783.     line='Upload area is full!'
  784.     CALL send2log(line)
  785.     SAY pen3||line||def||CR
  786.     RETURN 1
  787.   END
  788. IF frombb THEN
  789.   DO
  790.     checkproto='T'
  791.     targ=arg
  792.     DO WHILE checkproto='T'
  793.       arg=''
  794.       SAY CR
  795.       SAY 'Library:'pen3 plaindir def'  Filename:'pen3 targ def'  Protocol:'pen3 protocol||def||CR
  796.       pline=' ['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol'
  797.       pline=pline '['pen3'U'def']pload (qtU) > '
  798.       checkproto=getinput(1 1 pline)
  799.       IF checkproto='Q' THEN RETURN 1
  800.       IF checkproto='T' THEN CALL chpro()
  801.     END
  802.     arg=targ
  803.     CALL sound('UPLOAD')
  804.     uploadtime=TIME('E')
  805.     CALL checktime()
  806.     SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  807.     DownLoad arg
  808.     IF RC>0 THEN RETURN 2
  809.     IF bbsXferStats.baud(14 arg colorflag protocol) THEN RETURN 2
  810.     rbytes=WORD(STATEF(arg),2)
  811.     IF rbytes<1 THEN
  812.       DO
  813.         CALL DELETE(arg)
  814.         RETURN 2
  815.       END
  816.     temp=''
  817.     DO WHILE temp~='N' & temp~='Y'
  818.       temp=getinput(1 1 'Received' rbytes 'bytes. Was your upload successful? (ny) > ')
  819.     END
  820.     IF temp='N' THEN RETURN 2
  821.   END
  822. ELSE
  823.   DO
  824.     frompath=GETCLIP('BBS_frompath')
  825.     IF frompath='' THEN frompath='RAM:'
  826.     fdir=''
  827.     DO loop=1
  828.       fromfile=GetFile(150,36,frompath,'',' Select File to Upload ')
  829.       IF fromfile='' THEN RETURN 1
  830.       IF EXISTS(fromfile) THEN LEAVE loop
  831.       SAY
  832.       SAY fromfile 'does not exist!'
  833.     END
  834.     ADDRESS COMMAND 'C:COPY' fromfile PRAGMA('D') 'CLONE'
  835.     rbytes=WORD(STATEF(fromfile),2)
  836.     x=LASTPOS('/',fromfile)
  837.     IF x=0 THEN x=POS(':',fromfile)
  838.     IF x>0 THEN
  839.       DO
  840.         arg=SUBSTR(fromfile,x+1)
  841.         fdir=LEFT(fromfile,x)
  842.         IF RIGHT(fdir,1)='/' THEN fdir=LEFT(fdir,x-1)
  843.         CALL SETCLIP('BBS_frompath',fdir)
  844.       END
  845.     ELSE arg=fromfile
  846.   END
  847. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  848.   DO
  849.     SAY CR
  850.     SAY pen3'***'def arg pen3'failed archive check!'def||CR
  851.     SAY CR
  852.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  853.     IF temp~='Y' THEN
  854.       DO
  855.         CALL DELETE(arg)
  856.         SAY CR
  857.         RETURN 2
  858.       END
  859.   END
  860. IF ~frombb THEN RETURN 0
  861. CALL bytes2user(14 rbytes)
  862. ADDRESS AREXX bbsNewFile.rexx name PRAGMA('D')'/'arg
  863. IF bbsprefs.9 & name~=sysop THEN
  864.   DO
  865.     newufile=bbspath'EMail/'sysop'/NEW_FILES'
  866.     IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  867.     ELSE
  868.       DO
  869.         ok=OPEN(f,newufile,'W')
  870.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  871.       END
  872.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' plaindir'/'arg'  'DATE() TIME())
  873.     CALL CLOSE(f)
  874.   END
  875. RETURN 0
  876.  
  877.  
  878. bytes2user:
  879. PARSE ARG indx bytes .
  880. tfiles=WORD(data.indx,1)
  881. tbytes=WORD(data.indx,3)
  882. IF ~DATATYPE(tfiles,'W') THEN tfiles=0
  883. IF ~DATATYPE(tbytes,'W') THEN tbytes=0
  884. tbytes=tbytes+bytes
  885. tfiles=tfiles+1
  886. IF tfiles>1 THEN data.indx=tfiles 'files' tbytes 'bytes.'
  887. ELSE data.indx='1 file' bytes 'bytes.'
  888. data.indx=data.indx DATE()
  889. CALL savedata(0)
  890. RETURN
  891.  
  892.  
  893. bbsspace:
  894. ARG tabspace .
  895. ADDRESS COMMAND 'C:info >'scratch'/infout' bbsdevice
  896. ok=OPEN(f,scratch'/infout','R')
  897. IF ok=0 THEN RETURN 20
  898. line=READLN(f)
  899. line=READLN(f)
  900. line=READLN(f)
  901. line=READLN(f)
  902. CALL CLOSE(f)
  903. IF tabspace<14 THEN SAY CR
  904. bbsk=WORD(line,4)
  905. IF ~DATATYPE(bbsk,'N') THEN
  906.   DO
  907.     line=bbsdevice 'is not an info compatible device!'
  908.     CALL send2log(line)
  909.     SAY pen3||line||def||CR
  910.     bbsk=0
  911.     RETURN
  912.   END
  913. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  914. IF bbsk<1 THEN bbsk=0
  915. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'CR
  916. RETURN
  917.  
  918.  
  919. comma: PROCEDURE
  920. ARG num .
  921. t=''
  922. x=POS('.',num)
  923. IF x>0 THEN t=SUBSTR(num,x)
  924. num=num%1
  925. dgt=LENGTH(num)
  926. numtext=''
  927. IF dgt>3 THEN numtext=','RIGHT(num,3)
  928. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  929. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  930. IF dgt>12 THEN
  931.   DO
  932.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  933.     numtext=LEFT(num,dgt-12)||numtext
  934.   END
  935. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  936. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  937. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  938. ELSE numtext=num
  939. RETURN numtext||t
  940.  
  941.  
  942. loaddata:
  943. IF name='' THEN RETURN 0
  944. IF OPEN(f,bbspath'USERS/'name,'R')=0 THEN RETURN 0
  945. data.=''
  946. DO i=1
  947.   line=READLN(f)
  948.   IF EOF(f) THEN BREAK
  949.   data.i=line
  950. END
  951. data.0=i-1
  952. CALL CLOSE(f)
  953. city=docity(data.3)
  954. protocol=data.6
  955. IF ~DATATYPE(data.7,'W') | data.7<5 THEN data.7=20
  956. linesperpage=data.7
  957. IF ~frombb THEN linesperpage=20
  958. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  959. ELSE colorflag=0
  960. clr=''
  961. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  962. level=data.20
  963. RETURN 1
  964.  
  965.  
  966. savedata:
  967. IF OPEN(f,bbspath'USERS/'name,'W')=0 THEN RETURN
  968. IF data.0<27 THEN data.0=27
  969. DO i=1 TO data.0
  970.   CALL WRITELN(f,data.i)
  971. END
  972. CALL CLOSE(f)
  973. SAY 'User' name 'has been updated.'CR
  974. RETURN
  975.  
  976.  
  977. sound:
  978. ARG snd 
  979. IF bbsprefs.13=1 THEN RETURN
  980. ADDRESS AREXX bbsSounds.rexx bbspath'Sounds/' snd 
  981. RETURN
  982.  
  983.  
  984. check_alias:
  985. ARG ali .
  986. IF ~DATATYPE(Friends.0,'W') THEN RETURN ali
  987. DO ii=1 TO Friends.0
  988.   IF UPPER(WORD(Friends.ii,1))=ali THEN RETURN WORD(Friends.ii,2)
  989. END
  990. RETURN ali
  991.  
  992.  
  993. docity:
  994. PARSE ARG citi
  995. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  996. DO i=WORDS(citi) TO 1 BY -1
  997.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  998.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  999. END
  1000. citi=SPACE(citi,1)
  1001. RETURN STRIP(citi)
  1002.  
  1003.  
  1004. send2log:
  1005. PARSE ARG sendline
  1006. IF ~frombb THEN RETURN
  1007. logfile=bbspath'Logs/log.'DATE('S')    /* daily logs */
  1008. fl='W'
  1009. IF EXISTS(logfile) THEN fl='A'
  1010. IF ~OPEN('log',logfile,fl) THEN
  1011.   DO
  1012.     IF ~OPEN('log',logfile,fl) THEN
  1013.       DO
  1014.         SAY 'failed to open log file'
  1015.         RETURN
  1016.      END
  1017.   END
  1018. CALL WRITELN('log','bbsWrite:' sendline)
  1019. CALL CLOSE('log')
  1020. RETURN
  1021.  
  1022.  
  1023. checktime:
  1024. IF ~frombb THEN RETURN
  1025. IF TIME('E')>maxtime THEN EXIT
  1026. IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
  1027. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  1028. CALL checkdcd()
  1029. RETURN
  1030.  
  1031.  
  1032. cleanline:
  1033. ARG lflag .
  1034. IF nonstop=0 & clr~='' THEN
  1035.   DO
  1036.     Send clr
  1037.     RETURN
  1038.   END
  1039. IF colorflag~=1 & lflag=1 THEN RETURN
  1040. cline=lineup||LEFT(' ',78)
  1041. IF lflag=1 THEN cline=cline||lineup
  1042. SAY cline||CR
  1043. RETURN
  1044.  
  1045.  
  1046. getinput:
  1047. PARSE ARG upflag' 'oneflag' 'pline
  1048. CALL checkdcd()
  1049. OPTIONS PROMPT pline
  1050. PARSE PULL inarg
  1051. inarg=STRIP(inarg)
  1052. IF upflag THEN inarg=UPPER(inarg)
  1053. IF oneflag THEN inarg=LEFT(inarg,1)
  1054. inarg=cleanstring(0':'inarg)
  1055. RETURN inarg
  1056.  
  1057.  
  1058. strip_ansi:
  1059. PARSE ARG aline 
  1060. n=POS('1B'x,aline)
  1061. DO WHILE n>0
  1062.   DO k=2
  1063.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  1064.       leave k
  1065.   END
  1066.   aline=DELSTR(aline,n,k+1)
  1067.   n=POS('1B'x,aline)
  1068. END
  1069. RETURN aline
  1070.  
  1071.  
  1072. cleanstring:
  1073. PARSE ARG nflag':'cstr
  1074. IF nflag=1 THEN
  1075.   DO
  1076.     cstr=COMPRESS(cstr,"'`")
  1077.     cstr=TRANSLATE(cstr,,namemask)
  1078.     cstr=SPACE(cstr,1,'_')
  1079.     RETURN cstr
  1080.   END
  1081. bot=XRANGE(,'1F'x)
  1082. IF nflag=2 THEN bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
  1083. ELSE cstr=strip_ansi(cstr)
  1084. top=XRANGE('7F'x)
  1085. cstr=COMPRESS(cstr,bot||top)
  1086. IF nflag=0 THEN cstr=STRIP(cstr)
  1087. RETURN cstr
  1088.  
  1089.  
  1090. countcheck:
  1091. PARSE ARG fname' 'cknum .
  1092. IF ~EXISTS(fname) THEN
  1093.   DO
  1094.     IF cknum=0 THEN RETURN 0
  1095.     IF OPEN(f,fname,'W')=0 THEN RETURN 0
  1096.     CALL WRITELN(f,cknum)
  1097.     CALL CLOSE(f)
  1098.     RETURN cknum
  1099.   END
  1100. IF OPEN(f,fname,'R')=0 THEN
  1101.   DO
  1102.     CALL DELAY(99)
  1103.     IF OPEN(f,fname,'R')=0 THEN RETURN cknum
  1104.   END
  1105. retval=STRIP(READLN(f))
  1106. CALL CLOSE(f)
  1107. IF ~DATATYPE(retval,'W') THEN retval=0
  1108. IF ~DATATYPE(cknum,'W') THEN cknum=0
  1109. IF retval<cknum THEN
  1110.   DO
  1111.     IF OPEN(f,fname,'W')~=0 THEN
  1112.       DO
  1113.         CALL WRITELN(f,cknum)
  1114.         CALL CLOSE(f)
  1115.         RETURN cknum
  1116.       END
  1117.   END
  1118. RETURN retval
  1119.  
  1120.  
  1121. checkdcd:
  1122. IF ~frombb THEN RETURN
  1123. dcd
  1124. IF RC=0 THEN
  1125.   DO
  1126.     DO dcds=1 TO 3  /* 5 second delay */
  1127.       CALL DELAY(50)
  1128.       dcd
  1129.       IF RC~=0 THEN RETURN
  1130.     END
  1131.     dcd
  1132.     IF RC=0 THEN EXIT 0
  1133.   END
  1134. xmsg=GETCLIP('BBS_MESSAGE')
  1135. Capture
  1136. IF RC=0 & xmsg~='' THEN
  1137.   DO
  1138.     CALL SETCLIP('BBS_MESSAGE')
  1139.     SAY CR
  1140.     SAY bak2' Message From BBBBS: 'def||CR
  1141.     SAY xmsg||CR
  1142.     SAY CR
  1143.     CALL waiting()
  1144.   END
  1145. IF POS('G',GETCLIP('BBS_COMMAND'))>0 THEN EXIT
  1146. RETURN
  1147.  
  1148.  
  1149. BREAK_E:
  1150. i=999999
  1151. ri=999999
  1152. wi=999999
  1153. RETURN
  1154.  
  1155.  
  1156. BREAK_C:
  1157. EXIT 0
  1158.  
  1159.  
  1160. FAILURE:
  1161. SYNTAX:
  1162. lin.1=''ERRORTEXT(RC)''
  1163. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  1164. lin.3=SIGL ''SOURCELINE(SIGL)''
  1165. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  1166. DO er=1 TO 4
  1167.   IF level>sysoplevel | ~frombb THEN SAY 'bbsWrite:' lin.er||CR
  1168.   IF frombb THEN CALL send2log(lin.er)
  1169. END
  1170. EXIT 0
  1171.  
  1172. /* bbsWrite.rexx */
  1173.